﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BE;
using DAL;
using BE.SearchCriteria;
using BLL.Exceptions;
using System.Transactions;
using BLL.Common;
namespace BLL
{
    public class ArticulosCampañasBLL : BaseBLL
    {

        public static List<ArticulosCampañaBE> BuscarArticulosCampaña(BaseSC pFiltroSC)
        {
            ArticulosCampañasDAL oArticulosCampañasDAL = new ArticulosCampañasDAL();

            return oArticulosCampañasDAL.BuscarArticulosCampaña(pFiltroSC);
        }

        public static List<ArticulosCampañaBE> SeleccionarPorCampaña(BaseSC pFiltroSC)
        {
            ArticulosCampañasDAL oArticulosCampañasDAL = new ArticulosCampañasDAL();

            List<ArticulosCampañaBE> oListArticulosCampañas = new List<ArticulosCampañaBE>();
            oListArticulosCampañas = oArticulosCampañasDAL.SeleccionarPorCampaña(pFiltroSC);

            if (oListArticulosCampañas != null && oListArticulosCampañas.Count > 0)
            {
                PresentacionDAL oPresentacionDAL = new PresentacionDAL();

                oListArticulosCampañas.ForEach(x => x.Articulo.Presentaciones =
                                                    oPresentacionDAL.SeleccionarPorIdArticulo(x.Articulo.IdArticulo)
                                              );
            }

            return oListArticulosCampañas;
        }

        public static void ImportarArticulos(int pIdCampaña)
        {
            ArticulosCampañasDAL oArticulosCampañasDAL = new ArticulosCampañasDAL();
            oArticulosCampañasDAL.ImportarArticulos(pIdCampaña);

        }

        public static void Guardar(int pIdCampaña, List<ArticulosCampañaBE> pListBE, AccionesListBLL<int> pAccionesList)
        {
            try
            {
                Validar(pListBE);

                using (TransactionScope scope = new TransactionScope())
                {
                    ArticulosCampañasDAL oArticulosCampañasDAL = new ArticulosCampañasDAL();

                    foreach (var accion in pAccionesList.AccionesElemento.Where(x => x.Value != AccionElemento.Ninguna))
                    {
                        if (accion.Value != AccionElemento.Eliminar)
                        {
                            ArticulosCampañaBE oElemBE = pListBE.Find(x => x.Articulo.IdArticulo == accion.Key);
                            if (oElemBE != null)
                            {
                                switch (accion.Value)
                                {
                                    case AccionElemento.Crear:
                                        oArticulosCampañasDAL.Insertar(oElemBE);
                                        break;
                                    case AccionElemento.Editar:
                                        oArticulosCampañasDAL.Modificar(oElemBE);
                                        break;                                    
                                }
                            }
                        }
                        else
                        {
                            oArticulosCampañasDAL.Eliminar(pIdCampaña, accion.Key);
                        }

                    }
                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                if (!HandleException(ex))
                    throw;
            }
        }

        private static void Validar(List<ArticulosCampañaBE> pListBE)
        {           
            if (pListBE == null || pListBE.Count == 0)
                throw new BLLException("Debe cargar la página y precio de algún artículo.");

        }


       
    }
}
